package E_2024;

import java.util.Stack;

public class E_100_3 {
    /*
    为了便于业务交互，约定一个对输入的字符串中的下划线做统一替换
    具体要求L对于给定的输入字符串，将其中包含的每一个下划线"_"，使用特殊字符串"(^|$|[,+])"替换，并输出替换后的结果
        其中的例外场景不做替换，场景如下：
        1.在一堆方括号之内的下划线则不替换
        2.为转义的下划线，即"\_"则不替换
    备注：
        1.调用者已经保证，输入表达式的方括号会成对出现，并且方括号会存在嵌套。即存在"[xx[yyyy]xxx]"这种形式的字符串
        2.输入字符串的长度范围：[0, 10000]
    示例1
    输入
        "^(_9494)"
    输出
        "^((^|$|[,+])9494)"
     */
    public static void main(String[] args) {
        ans1("_9494)","(^|$|[,+])");
        ans1("^(_9494)","(^|$|[,+])");
        ans1("^([_949]4)","(^|$|[,+])");
        ans1("^(/_9494)","(^|$|[,+])");
        ans1("^[(/[_9]]494)","(^|$|[,+])");
        ans1("^[(/[_9]]49_4)","(^|$|[,+])");
    }
    public static void ans1(String str, String temp){
        Stack<Character> stack = new Stack<>();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            // 检查[]的匹配情况，
            if (ch == '[') stack.add(ch);
            else if (ch == ']') stack.pop();
            // 当符号在[]内部，或前一个符号为/时不做替换
            if (ch == '_' && stack.isEmpty() && (i == 0 || str.charAt(i-1) != '/')){
                sb.append(temp);
            }else {
                sb.append(ch);
            }
        }
        System.out.println(sb);
    }
}
